Move block device bind/unbind into hotplug scripts.
authorcl349@firebug.cl.cam.ac.uk <cl349@firebug.cl.cam.ac.uk>
Mon, 12 Sep 2005 19:49:03 +0000 (19:49 +0000)
committercl349@firebug.cl.cam.ac.uk <cl349@firebug.cl.cam.ac.uk>
Mon, 12 Sep 2005 19:49:03 +0000 (19:49 +0000)
Fixes file: devices since unbind now runs after the backend driver
closes the loopback device.
Also moves name -> node translation into the backend domain.
Signed-off-by: Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
tools/examples/Makefile
tools/examples/block-enbd
tools/examples/block-file
tools/examples/block-phy [new file with mode: 0644]
tools/examples/xen-backend.agent
tools/python/xen/xend/XendDomainInfo.py

index f23bb809565779c76f3dbb51f745c44843740bf8..36edb8789ff545baf36e5c73f057ab87f954df2a 100644 (file)
@@ -21,6 +21,7 @@ XEN_CONFIGS += xmexample.vmx
 XEN_SCRIPT_DIR = /etc/xen/scripts
 XEN_SCRIPTS = network-bridge vif-bridge
 XEN_SCRIPTS += network-route vif-route
+XEN_SCRIPTS += block-phy
 XEN_SCRIPTS += block-file
 XEN_SCRIPTS += block-enbd
 
index a8fa108f0de052022f46cc99e29595387e69e95c..c86068d817b37dcb95ea5a60025bfb5320899d3f 100755 (executable)
@@ -3,31 +3,31 @@
 # Usage: block-enbd [bind server ctl_port |unbind node]
 #
 # The file argument to the bind command is the file we are to bind to a
-# loop device.  We print the path to the loop device node to stdout.
+# loop device.
 #
 # The node argument to unbind is the name of the device node we are to
 # unbind.
 #
 # This assumes you're running a correctly configured server at the other end!
 
-case $1 in
-       bind)
-               for dev in /dev/nd*; do
-                       if nbd-client $2:$3 $dev; then
-                               echo $dev
-                               exit 0
-                       fi
-               done
-               exit 1
-       ;;
-
-       unbind)
-               nbd-client -d $2
-               exit 0
-       ;;
+set -e
 
-       *)
-               echo 'Unknown command: ' $1 >&2
-               echo 'Valid commands are: bind, unbind' >&2
-               exit 1
+case $1 in
+  bind)
+    for dev in /dev/nd*; do
+      if nbd-client $2:$3 $dev; then
+        major=$(stat -L -c %t "$dev")
+        minor=$(stat -L -c %T "$dev")
+        pdev=$(printf "0x%02x%02x" 0x$major 0x$minor)
+        xenstore-write "$XENBUS_PATH"/physical-device $pdev \
+          "$XENBUS_PATH"/node $dev
+        exit 0
+      fi
+    done
+    exit 1
+    ;;
+  unbind)
+    nbd-client -d $2
+    exit 0
+    ;;
 esac
index a1612b6d47cafb40535c43feb9073c97cbb91d1d..3270fa07ba02d8d07c5dc354b98dccba036e3785 100755 (executable)
@@ -3,29 +3,29 @@
 # Usage: block_loop [bind file|unbind node]
 #
 # The file argument to the bind command is the file we are to bind to a
-# loop device.  We print the path to the loop device node to stdout.
+# loop device.
 #
 # The node argument to unbind is the name of the device node we are to
 # unbind.
 
-case $1 in
-       bind)
-               for dev in /dev/loop*; do
-                       if losetup $dev $2; then
-                               echo $dev
-                               exit 0
-                       fi
-               done
-               exit 1
-       ;;
-
-       unbind)
-               losetup -d $2
-               exit 0
-       ;;
+set -e
 
-       *)
-               echo 'Unknown command: ' $1 >&2
-               echo 'Valid commands are: bind, unbind' >&2
-               exit 1
+case $1 in
+  bind)
+    for dev in /dev/loop*; do
+      if losetup $dev $2; then
+        major=$(stat -L -c %t "$dev")
+        minor=$(stat -L -c %T "$dev")
+        pdev=$(printf "0x%02x%02x" 0x$major 0x$minor)
+        xenstore-write "$XENBUS_PATH"/physical-device $pdev \
+          "$XENBUS_PATH"/node $dev
+        exit 0
+      fi
+    done
+    exit 1
+    ;;
+  unbind)
+    losetup -d $2
+    exit 0
+    ;;
 esac
diff --git a/tools/examples/block-phy b/tools/examples/block-phy
new file mode 100644 (file)
index 0000000..a19a861
--- /dev/null
@@ -0,0 +1,30 @@
+#! /bin/sh
+
+set -e
+
+expand_dev() {
+  local dev
+  case $1 in
+  /*)
+    dev=$1
+    ;;
+  *)
+    dev=/dev/$1
+    ;;
+  esac
+  echo -n $dev
+}
+
+case $1 in
+  bind)
+    dev=$(expand_dev $2)
+    major=$(stat -L -c %t "$dev")
+    minor=$(stat -L -c %T "$dev")
+    pdev=$(printf "0x%02x%02x" 0x$major 0x$minor)
+    xenstore-write "$XENBUS_PATH"/physical-device $pdev \
+        "$XENBUS_PATH"/node $dev
+    exit 0
+    ;;
+  unbind)
+    ;;
+esac
index 0058bd2842a58cf271ac0729c5067328a4e4ac14..91a5d0eb32a0336000e6aa8341e98903e2bd8d28 100755 (executable)
@@ -9,8 +9,26 @@ PATH=/etc/xen/scripts:$PATH
 
 case "$ACTION" in
   add)
+    case "$XENBUS_TYPE" in
+      vbd)
+        t=$(xenstore-read "$XENBUS_PATH"/type)
+        params=$(xenstore-read "$XENBUS_PATH"/params)
+        [ -x /etc/xen/scripts/block-"$t" ] && \
+            /etc/xen/scripts/block-"$t" bind $params
+        ;;
+    esac
     ;;
   remove)
+    case "$XENBUS_TYPE" in
+      vbd)
+        t=$(xenstore-read "$XENBUS_PATH"/type)
+        node=$(xenstore-read "$XENBUS_PATH"/node)
+        [ -x /etc/xen/scripts/block-"$t" ] && \
+            /etc/xen/scripts/block-"$t" unbind $node
+        ;;
+    esac
+    # remove device backend store entries
+    xenstore-rm "$XENBUS_PATH"
     ;;
   online)
     case "$PHYSDEVDRIVER" in
index 5cfd6133da15b1d7c9ec0e8f0db6515635f34556..07e6d4c57bbace1f97ea635fe55bec2bae4dcd46 100644 (file)
@@ -413,17 +413,13 @@ class XendDomainInfo:
             db['backend'] = backdb.getPath()
             db['backend-id'] = "%i" % backdom.id
 
-            backdb['frontend'] = db.getPath()
             (type, params) = string.split(sxp.child_value(devconfig, 'uname'), ':', 1)
-            node = Blkctl.block('bind', type, params)
+            backdb['type'] = type
+            backdb['params'] = params
+            backdb['frontend'] = db.getPath()
             backdb['frontend-id'] = "%i" % self.id
-            backdb['physical-device'] = "%li" % blkdev_name_to_number(node)
             backdb.saveDB(save=True)
 
-            # Ok, super gross, this really doesn't belong in the frontend db...
-            db['type'] = type
-            db['node'] = node
-            db['params'] = params
             db.saveDB(save=True)
             
             return
@@ -808,9 +804,6 @@ class XendDomainInfo:
             if type == 'vbd':
                 typedb = ddb.addChild(type)
                 for dev in typedb.keys():
-                    devdb = typedb.addChild(str(dev))
-                    Blkctl.block('unbind', devdb['type'].getData(),
-                                 devdb['node'].getData())
                     typedb[dev].delete()
                 typedb.saveDB(save=True)
             if type == 'vtpm':